#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;

string toHex(pthread_t tid)
{
    char hex[64];
    snprintf(hex, sizeof(hex), "%p", tid);
    return hex;
}

void* threadRoutine(void* args)
{
    while(true)
    {
        cout << "thread id: " << toHex(pthread_self()) << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");

    while(true)
    {
        cout << "main threadid : " << toHex(pthread_self()) << endl;
        sleep(1);
    }
    pthread_join(tid, nullptr);

    return 0;
}

// class Request
// {
// public:
//     Request(int start, int end, const string& threadname)
//         : _start(start)
//         , _end(end)
//         , _threadname(threadname)
//     {}

//     int Sum()
//     {
//         int sum = 0;
//         for(int i = _start; i <= _end; i++)
//         {
//             sum += i;
//             cout << _threadname << " is running ..." << i << endl;
//             usleep(100000);
//         }
//         return sum;
//     }

// public:
//     int _start;         // 起始
//     int _end;           // 结束
//     string _threadname; // 线程名
// };

// class Response
// {
// public:
//     Response(int result, int exitcode)
//         : _result(result)
//         , _exitcode(exitcode)
//     {}

// public:
//     int _result;        // 计算结果
//     int _exitcode;      // 计算结果是否准确
// };

// void* sumCount(void* args)
// {
//     Request* rq = static_cast<Request*>(args);
//     Response* ret = new Response(0, 0);

//     ret->_result = rq->Sum();
//     delete rq;
//     return ret;
// }

// int main()
// {
//     pthread_t tid;
//     Request* rq = new Request(0, 100, "thread 1");
//     pthread_create(&tid, nullptr, sumCount, rq);

//     void* retval;
//     pthread_join(tid, &retval);
//     Response* res = static_cast<Response*>(retval);
//     cout << "result: " << res->_result << ", exitcode: " << res->_exitcode << endl;
//     delete res;
//     return 0;
// }

// int g_val = 10;

// void show(const string& name)
// {
//     cout << name << "say# hello thread" << endl;
// }

// void* threadRoutine(void* args)
// {
//     const char* name = (const char*)args;
//     int count = 0;
//     while(true)
//     {
//         //printf("%s, pid: %d, g_val: %d, &g_val: %p\n", name, getpid(), g_val, &g_val);
//         //cout << "new thread pid: " << getpid() << endl;
//         show("[new thread]");
//         sleep(1);

//         count++;
//         if(count == 7)
//             break;
//     }

//     pthread_exit((void*)16);
//     //return (void*)15;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"Thread 1");

//     int count = 0;
//     while(true)
//     {
//         //printf("main thread, pid: %d, g_val: %d, &g_val: %p\n", getpid(), g_val, &g_val);
//         show("[main thread]");
//         sleep(1);

//         count++;
//         if(count == 5)
//             break;
//     }

//     void* retval;
//     pthread_join(tid, &retval);

//     cout << "main thread quit, ret: " << (long long int)retval << endl; 

//     return 0;
// }